export const getInputs = () => [['3+2*2'], [' 3/2 '], [' 3+5 / 2 '], [' 3- 5 / 2 ']];

/**
 * **[227. 基本计算器 II](https://leetcode.cn/problems/basic-calculator-ii/)**
 *
 * 给你一个字符串表达式 `s` ，请你实现一个基本计算器来计算并返回它的值。
 *
 * 整数除法仅保留整数部分。
 *
 * 你可以假设给定的表达式总是有效的。所有中间结果将在 `[-2^31, 2^31 - 1]` 的范围内。
 *
 * **注意：**不允许使用任何将字符串作为数学表达式计算的内置函数，比如 `eval()` 。
 *
 * @param s
 * @returns
 */
export default function (s: string): number {
	const stack: (number | string)[] = [];

	const mul = (a: number, b: number) => {
		return a * b;
	};
	const div = (a: number, b: number) => {
		return ~~(a / b); // 按位取反再取反模拟整除
	};

	let tmp = '';
	const checkTmp = () => {
		if (tmp !== '') {
			const tmpNum = Number(tmp);
			tmp = '';

			switch (stack.at(-1)) {
				case '*':
					stack.pop();
					stack.push(mul(stack.pop() as number, tmpNum));
					break;
				case '/':
					stack.pop();
					stack.push(div(stack.pop() as number, tmpNum));
					break;
				default:
					stack.push(tmpNum);
			}
		}
	};

	for (const char of s) {
		switch (char) {
			case '+':
			case '-':
			case '*':
			case '/':
				checkTmp();
				stack.push(char);
				break;
			case ' ':
				break;
			default:
				tmp = `${tmp}${char}`;
		}
	}
	checkTmp();

	let result = 0;
	{
		let flag = true;
		for (const item of stack) {
			switch (item) {
				case '+':
					flag = true;
					break;
				case '-':
					flag = false;
					break;
				default:
					result = flag ? result + (item as number) : result - (item as number);
			}
		}
	}

	return result;
}
